#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2017/6/20 22:53
# @Author  : Beam
# @File    : sqlalchemy外键关联.py


from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base  #orm基类方法
from sqlalchemy import Column, Integer, String, ForeignKey   #导入字段方法
from sqlalchemy.orm import sessionmaker  #从orm中导入方法
from sqlalchemy.orm import relationship

engine = create_engine("mysql+pymysql://Beam:liang123456@192.168.6.248/beam?charset=utf8",encoding='utf-8', echo=False)  #创建引擎,使用什么样的方式操作mysql  ,参数echo表示会打印执行的信息
Base = declarative_base()  # 生成orm基类，用import的方法生成基类

Session_class = sessionmaker(bind=engine)  # 创建与数据库的会话session class ,注意,这里返回给session的是个class,不是实例
Session = Session_class()  # 生成session实例

class User(Base): #一个表一个类
    __tablename__ = 'user'  #创建一个表的写法
    id = Column(Integer,autoincrement=True,primary_key=True) #id这个字段为主键
    name = Column(String(32))
    password = Column(String(64))

    def __repr__(self):
        #这样可以直接实例对象直接打算返回的数据，而不是打印一个内存地址
        return "<User(name='%s',  password='%s')>" % (self.name, self.password)

'''创建一个address表，跟user表关联'''
class Address(Base):
    __tablename__ = 'addresses'  #表名
    id = Column(Integer,primary_key=True,autoincrement=True)
    email_address = Column(String(32),nullable=False)
    user_id = Column(Integer,ForeignKey('user.id'))  #外键到user表的id字段
    user = relationship("User",backref="addresses")  #允许你在user表里通过backref字段反向查出所有它在addresses表里的关联项

    def __repr__(self):
        return "<Address(email_address='%s')>" % self.email_address

Base.metadata.create_all(engine)  #注意要把engine填进去，通过base这个实例对象调用metadata.create_all方法创建表结构

# #反查表字段
# obj = Session.query(User).filter_by(name='Mity').first()  #查出user表的第一条数据并生成对象obj
# print(obj.addresses) #当查找到唯一的数据时候，可以通过这个生成的对象输出外键表的字段
# addr_obj = Session.query(Address).first() #同理外键表的对象可以输出主键的对象，relationship很牛逼的功能
# print(addr_obj.user.name)

# #创建关联对象
# obj = Session.query(User).filter(User.name=='Mity').all()[0]  #查询name字段是Mity的数据，[0]并只取第一条
# print(obj.addresses)
# obj.addresses = [Address(email_address="r1@126.com"),Address(email_address="r2@126.com")]  #这样插入外键数据，是多条的
# Session.commit()
# print(obj.addresses)





































